/**
 * @author LKQ
 * @date 2022/1/8 17:40
 * @description 双指针中，每一次比较需要在t中寻找下一个匹配字符， 对于进阶问题时间复杂度较高，
 * 采用动态规划先预处理令 f[i][j] 表示字符串 t 中从位置 i 开始往后字符 j 第一次出现的位置
 * 则f[i][j] = {
 *     i, t[i] = j;
 *     f[i+1][j], t[i] != j;
 * }
 */
public class FormalSolution {
    public static void main(String[] args) {
        FormalSolution solution = new FormalSolution();
        solution.isSubsequence("abc", "ahbgdc");
    }
    public boolean isSubsequence(String s, String t) {
        int n = s.length(), m = t.length();
        //  f[i][j] 表示字符串 t 中从位置 i 开始往后字符 j 第一次出现的位置
        int[][] f = new int[m + 1][26];
        // 从位置m开始往后不存在字符j
        for (int i = 0; i < 26; i++) {
            f[m][i] = m;
        }

        for (int i = m - 1; i >= 0; i--) {
            for (int j = 0; j < 26; j++) {
                if (t.charAt(i) == j + 'a') {
                    f[i][j] = i;
                } else {
                    f[i][j] = f[i + 1][j];
                }
            }
        }
        int add = 0;
        for (int i = 0; i < n; i++) {
            if (f[add][s.charAt(i) - 'a'] == m) {
                return false;
            }
            add = f[add][s.charAt(i) - 'a'] + 1;
        }
        return true;
    }

}
